package Reactor;

import org.junit.Test;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * @projectName: Webflux_demo
 * @package: Reactor
 * @className: ReactoDemo
 * @author: 冷环渊 doomwatcher
 * @description: TODO
 * @date: 2021/12/14 2:30
 * @version: 1.0
 */
public class ReactoDemo {
    public static void main(String[] args) {

    }

    /**
     * @author 冷环渊 Doomwatcher
     * @context: 这里是 Mono 创建 0-1个元素序列的测试方法
     * @date: 2021/12/14 15:01
     * @param
     * @return: void
     */
    @Test
    public void MonoTset() {
        // 1. Mono 的创建方式
        /*
         *创建 空的 Mono 对象 输出 “”
         *     public final Disposable subscribe(Consumer<? super T> consumer) {
         *   Objects.requireNonNull(consumer, "consumer");
         *  return this.subscribe(consumer, (Consumer)null, (Runnable)null);
         * }
         * 从源码看出 我们的 subsrcibe参数是 Consumer，也就是说只进 不出
         * */
        Mono.empty().subscribe(System.out::println);
        /*
         *创建一个 Mono 输出内容就是我们just（）参数的内容
         * public static <T> Mono<T> just(T data) {
         *     return onAssembly(new MonoJust(data));
         * }
         * */
        Mono.just("我的今天就结束 webflux 的学习了 hello Mono").subscribe(System.out::println);
    }

    /**
     * @author 冷环渊 Doomwatcher
     * @context: 这里是 flux 创建多个 0-n个元素序列 测试方法
     * @date: 2021/12/14 15:01
     * @param
     * @return: void
     */
    @Test
    public void FluxTset() {
        // 创建一个Flux 
        Flux.just(1, 2, 3, 4, 5, 6).subscribe(System.out::print);
        System.out.println();
        //创建多个 集合的形式
        Flux.fromIterable(Arrays.asList("a1", "b1", "c1", "d1")).subscribe(System.out::print);
        System.out.println();
        //创建多个 数组的形式
        Flux.fromArray(new String[]{"a1", "b1", "c1", "d1", "e1"}).subscribe(System.out::print);
        System.out.println();
        //基于流创建
        Flux.fromStream(Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)).subscribe(System.out::print);
        //通过饭未创建
        System.out.println();
        Flux.range(1, 100).subscribe(System.out::println);

        /*
         * 小案例
         * Flux.generate这里我们以两个参数为例子
         * 2的乘法口诀
         * 2*0 = 0
         * 2*1=1
         * 2*2 = 4
         * */
        Flux.generate(() -> 0, (i, sink) -> {
            sink.next("2*" + i + "=" + 2 * i);
            if (i == 9) {
                sink.complete();
            }
            return i + 1;
        }).subscribe(System.out::println);

    }

    /**
     * @author 冷环渊 Doomwatcher
     * @context: 响应式变成小练习
     * 给一定随机英文字符串，要求以26个字母的顺序输出排列
     * 小冷没看视频 用Stream流api 编写的
     * @date: 2021/12/14 16:44
     * @param
     * @return: void
     */
    @Test
    public void StreamDemoTest() {
        String[] arr = new String[]{"hello", "guys", "i", "prizev", "abc"};
        List<String> list = Arrays.asList(arr);
        list.stream()
                .filter(i -> !i.isEmpty())
                .flatMap(i -> Stream.of(i.split("")))
                .distinct()
                .sorted()
                .forEach(System.out::print);
    }

    /**
     * @author 冷环渊 Doomwatcher
     * @context: 这个是根据视频 用 reactor flux api 编写的
     * @date: 2021/12/14 16:54
     * @param
     * @return: void
     */
    @Test
    public void VedioReactorTest() {
        String str = "hello guys i am bole welcome to normal school jdk quick fox prizev ";
        Flux.fromArray(str.split(" "))
                .flatMap(i -> Flux.fromArray(i.split("")))
                .distinct()
                .sort()
                .subscribe(System.out::print);
    }
}
